import { appConfig, generateToken } from './js/config'
// #ifdef APP
import ZIM from './js/zego-ZIMUniplugin-JS/lib';
// #endif
// #ifdef MP-WEIXIN
import { ZIM } from './js/zego-zim-miniprogram';
// #endif
ZIM.create(appConfig);
let zim = ZIM.getInstance();

/**
 * @param name im接口名称
 * @param attr 获取im参数字段
 * @param args im系列参数
 */
export const imapi = ({ name, attr }, ...args) => {
	return new Promise(resolve => {
		zim[name](...args).then((res = {}) => {
			resolve(Object.assign({ code: 0 }, { data: res?.[attr] }))
		}).catch(async (err) => {
			if (err.code === 6000121) { //未登录拦截识别
				const login = await uni.$im.login()
				if (login.code === 0) {
					const data = await imapi({ name, attr }, ...args)
					resolve(data)
				}
				resolve(login)
			}
			resolve(err)
		})
	})
}
// 收到单聊通信的消息回调
zim.on('receivePeerMessage', (zim, { messageList, fromConversationID }) => {
	const conversationID = uni.getStorageSync('current_conversationID')
	if (conversationID === fromConversationID) {
		let data = [];
		messageList.forEach(v => {
			data = [...data, ...uni.$im.messageAttribute(v)]
		})
		uni.$emit('receivePeerMessage', data)
	}
});
// 收到群组消息的回调
zim.on('receiveGroupMessage', (zim, { messageList, fromConversationID }) => {
	console.log('receiveGroupMessage', messageList, fromConversationID);
	const conversationID = uni.getStorageSync('current_conversationID')
	if (conversationID === fromConversationID) {
		let data = [];
		messageList.forEach(v => {
			data = [...data, ...uni.$im.messageAttribute(v)]
		})
		uni.$emit('receiveGroupMessage', data)
	}
});
// 收到房间消息的回调
zim.on('receiveRoomMessage', (zim, { messageList, fromConversationID }) => {
	console.log('receiveRoomMessage', messageList, fromConversationID);
});
// 注册监听“令牌即将过期”的回调
zim.on('tokenWillExpire', (zim, second) => {
	const token = generateToken(); // 有效时长不能超过 24 天，重新请求开发者服务端获取 Token
	zim.renewToken(token).then(({ token }) => {
		// 更新成功
	}).catch((err) => {
		// 更新失败
	});
})
/**
 * 新增更新会话回调，以下几点事件：
  1、有新增会话。
	2、某些会话的最后一条消息更新。
	3、会话消息未读数量发生变化。
	4、会话被置顶或被取消置顶。
 */
zim.on('conversationChanged', (zim, { infoList }) => {
	uni.$emit('conversationChanged', infoList)
})